package ua.org.ass;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

/**
 *
 * @author Frick_ua
 */
public class DB {

	private DB (Connection connection) {
		this.connection = connection;
	}

	/**
	 * Повертає об’єкт дл яроботи з БД
	 * НАРАЗІ ПРАЦЮЄ ЛИШЕ З драйвером PostgreSQL!!!
	 *
	 * @param hostName - адреса серверу БД
	 * @param port - порт серверу, що прослуховується БД
	 * @param databaseName - ім’я БД
	 * @param userName - ім’я користувача БД
	 * @param userPassword - пароль користувача БД
	 * @return Об’єкт для роботи з БД
	 * @throws SQLException
	 */
	public static DB connect(String hostName, int port,
			  String databaseName, String userName, String userPassword)
			  throws SQLException {
		try {
			Class.forName("org.postgresql.Driver");
			return new DB(DriverManager.getConnection(
					  "jdbc:postgresql://" + hostName + ":" + port + "/" + databaseName,
					  userName, userPassword));
		} catch (ClassNotFoundException ex) {
			throw new SQLException(ex);
		}
	}

	public static DB connect(String resourceName) throws SQLException {
		try {
			InitialContext initCont = new InitialContext();
			DataSource ds = (DataSource) initCont.lookup("java:/comp/env/" + resourceName);
			return new DB(ds.getConnection());
		} catch (NamingException ex) {
			throw new SQLException(ex);
		}
	}

	/**
	 *
	 * @param query
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public ResultSet executeQuery(String query, Object... params)
			  throws SQLException {
		PreparedStatement ps = connection.prepareStatement(query,
				  ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		for (int i = 0; i < params.length; i++) {
			ps.setObject(i+1, params[i]);
		}
		return ps.executeQuery();
	}

	public ResultSet executeInsert(String query, String[] returnedValues, Object... params) throws SQLException {
		PreparedStatement ps = connection.prepareStatement(query, returnedValues);
		for (int i = 0; i < params.length; i++) {
			ps.setObject(i+1, params[i]);
		}
		return ps.executeUpdate() != -1 ? ps.getGeneratedKeys() : null;
	}

	public void closeConnection() throws SQLException {
		connection.close();
	}

	private transient Connection connection;
}
